home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1998 May / EnigmA AMIGA RUN 27 (1998)(G.R. Edizioni)(IT)[!][issue 1998-05].iso / earcd / sinclair-ql / no_tas_bas < prev    next >
Text File  |  1998-02-11  |  22KB  |  705 lines

  1. 10  TURBO_objfil "ram1_NO_TAS_task"
  2. 11  TURBO_taskn "NO_TAS"
  3. 12  TURBO_repfil "scr"
  4. 13  TURBO_windo 0
  5. 14  TURBO_diags 'omit'
  6. 15  TURBO_struct "S"
  7. 16  TURBO_model "<"
  8. 17  TURBO_objdat 4
  9. 18  TURBO_optim "R"
  10. 19 :
  11. 1000 REMark ------------------------------
  12. 1010 REMark      NO_TAS_bas - Mark J Swift
  13. 1020 REMark ...Turbo tweaks - SNG
  14. 1030 :
  15. 1040 REMark   Replace TAS with Line-A
  16. 1050 REMark     (1010111X XXXXXXXX)
  17. 1060 REMark    emulation instruction.
  18. 1110 REMark ------------------------------
  19. 1120 :
  20. 1210 DIM InFile$(100),OutFile$(100),Rplc$(1),P$(256),Src$(5),Dst$(40),Name$(40),Space$(40),temp$(40)
  21. 1215 verstag$="1.15"
  22. 1220 Buff=ALCHP(256)
  23. 1230 Rows=14
  24. 1240 DIM D(Rows/2)
  25. 1250 OPEN#3;"Con_456x234a28x12"
  26. 1260 OPEN#4;"Scr_104x12a362x20"
  27. 1270 OPEN#5;"Scr_436x142a38x99"
  28. 1280 InFlg%=0
  29. 1290 temp$=DATE$:Name$="ram1_NO_TAS_log"
  30. 1300 DELETE Name$
  31. 1310 OPEN_NEW#8;Name$
  32. 1320 PRINT#8;"NO_TAS started at ";temp$(13 TO 20);" on";temp$(5 TO 12);temp$(1 TO 4)\\
  33. 1330 REPeat outer_loop
  34. 1332  RETRY_HERE
  35. 1334  IF InFlg%<>0 THEN CLOSE#7:DELETE Dst$&"NO_TAS_dat":InFlg%=0
  36. 1340  IF COMPILED
  37. 1341   WHEN ERRor 
  38. 1342    PRINT #3\\"Error: "
  39. 1343    REPORT #3,ERNUM
  40. 1344    INPUT #3;\" Press ENTER to re-start.";Rplc$
  41. 1345    RETRY
  42. 1346   END WHEN 
  43. 1347  END IF 
  44. 1349  WINDOW#3;456,234,28,12:PAPER#3;0:INK#3;7:CLS#3:BORDER#3;3,2:BORDER#3;2,0:BORDER#3;1,2:WINDOW#3;438,220,36,19:BORDER#5;1,4:INK#5;4:PAPER#5;0
  45. 1350  CSIZE#3;2,1:PRINT#3;"NO_TAS v";verstag$:CSIZE#3;0,0
  46. 1360  PRINT#3;" AMIGA-FRIENDLY PATCHER";
  47. 1370  CLS#4:BORDER#4;1,7:INK#4;4:CLS#5
  48. 1380  WINDOW#3;438,40,36,59
  49. 1390  IF InFlg%=0 THEN 
  50. 1400   INK#5;7:PRINT#5;"PROBLEM:";:INK#5;4
  51. 1410   PRINT#5;" The Amiga hardware does not allow the CPU two contiguous bus"
  52. 1420   PRINT#5;" cycles. This means that all READ-MODIFY-WRITE cycles fail and as a"
  53. 1430   PRINT#5;" result the machine code instruction 'TAS' doesn't function correctly."
  54. 1440   PRINT#5;" (it can mess up the next instruction fetch)"
  55. 1450   INK#5;7:PRINT#5;"SOLUTION:";:INK#5;4
  56. 1460   PRINT#5;" This program removes TAS instructions in recognised TURBO'ed"
  57. 1470   PRINT#5;" and QLIB'ed tasks, substituting equivalent code. If the code is not"
  58. 1480   PRINT#5;" thus recognised, TAS will be replaced by a Line-A instruction (which is"
  59. 1490   PRINT#5;" programmed to emulate TAS but is not QL-compatible) or by extending the"
  60. 1500   PRINT#5;" code (which might confuse tasks that assume their own length). Under"
  61. 1510   PRINT#5;" such circumstances a disassembly is shown and you will be asked whether"
  62. 1520   PRINT#5;" or not to replace the code. The program may display TAS instructions"
  63. 1530   PRINT#5;" where none are present (i.e. within program DATA). A good rule-of-thumb"
  64. 1540   PRINT#5;" is that true CODE will usually be surrounded by other machine code"
  65. 1550   PRINT#5;" instructions, whereas DATA will be liberally sprinkled with DC.Ws";
  66. 1560   INPUT#3;\"Input FILE or VOLUME name  >";InFile$
  67. 1570   IF InFile$="" THEN EXIT outer_loop
  68. 1580   IF LEN(InFile$)=5 THEN 
  69. 1590    InFlg%=INT(((InFile$ INSTR "flp1_flp2_flp3_flp4_ram1_ram2_")+4)/5)
  70. 1600   ELSE 
  71. 1610    InFlg%=0
  72. 1620   END IF 
  73. 1630   IF InFlg%=0 THEN 
  74. 1640    INPUT#3;"         Output FILE name  >";OutFile$
  75. 1650    IF OutFile$="" THEN EXIT outer_loop
  76. 1660   ELSE 
  77. 1670    INPUT#3;"       Output VOLUME name  >";OutFile$
  78. 1680    IF OutFile$="" THEN InFlg%=0:EXIT outer_loop
  79. 1690    Src$=InFile$:Dst$=OutFile$
  80. 1700    DELETE Dst$&"NO_TAS_dat"
  81. 1710    OPEN_NEW#7;Dst$&"NO_TAS_dat"
  82. 1720    DIR#7;Src$:CLOSE#7
  83. 1730    OPEN_IN#7;Dst$&"NO_TAS_dat"
  84. 1740    INPUT#7;Name$,Space$
  85. 1750   END IF 
  86. 1760   CLS#5
  87. 1770  END IF 
  88. 1780  REPeat main_loop
  89. 1790   REPeat in_loop
  90. 1800    CLS#4:CLS#3:RPORT CHR$(10)
  91. 1810    IF InFlg%<>0 THEN 
  92. 1820     IF EOF(#7) THEN 
  93. 1830      EXIT main_loop
  94. 1840     ELSE 
  95. 1850      INPUT#7;InFile$
  96. 1860      OutFile$=Dst$&InFile$
  97. 1870      InFile$=Src$&InFile$
  98. 1880     END IF 
  99. 1890    END IF 
  100. 1895    IF FTEST(InFile$)<>0 THEN 
  101. 1896     EXIT main_loop
  102. 1897    ELSE 
  103. 1900     OPEN_IN#6;InFile$
  104. 1910     fl=FLEN(#6):ft=FTYP(#6):IF ft THEN fd=FDAT(#6)
  105. 1920     CLOSE#6
  106. 1930     RPORT "FILE: "&InFile$&CHR$(10)
  107. 1940     IF fl=0 THEN 
  108. 1950      RPORT "ZERO length!"&CHR$(10)
  109. 1960      IF InFlg%=0 THEN EXIT main_loop
  110. 1970     ELSE 
  111. 1971      INK#3;4
  112. 1972      IF ft=1 AND fd<>0 THEN 
  113. 1974       RPORT "Executable TASK"&CHR$(10)
  114. 1976      ELSE 
  115. 1980       temp$=FILE_CLASS$(InFile$)
  116. 1990       IF temp$<>"" THEN 
  117. 2000        RPORT "Possible "&temp$&CHR$(10)
  118. 2010       END IF 
  119. 2012      END IF 
  120. 2014      INK#3;7
  121. 2020      IF InFlg%=0 THEN 
  122. 2030       EXIT in_loop
  123. 2040      ELSE 
  124. 2050       RPORT "TAS replace :":Rplc$=WAITKEY$(3,"ynq")
  125. 2060       IF Rplc$=="y" THEN EXIT in_loop
  126. 2070       IF Rplc$=="q" THEN EXIT main_loop
  127. 2080      END IF 
  128. 2090     END IF 
  129. 2095    END IF 
  130. 2100   END REPeat in_loop
  131. 2110   CLS#5
  132. 2120   base=ALCHP(fl+1024)
  133. 2130   IF base>0 THEN 
  134. 2140    LBYTES InFile$,base
  135. 2150   ELSE 
  136. 2160    PRINT#3;\"Out of memory!"
  137. 2170    EXIT outer_loop
  138. 2180   END IF 
  139. 2190   REMark do it
  140. 2200   NoRpc%=0:RecogFlg%=0
  141. 2210   IF PEEK_W(base+6)<>HEX("4AFB") THEN 
  142. 2220    fixQLIB
  143. 2230    IF RecogFlg%=0 THEN 
  144. 2240     RPORT "UNRECOGNISED CODE:..."&CHR$(10)
  145. 2250    END IF 
  146. 2260   ELSE 
  147. 2270    fixTURBO
  148. 2280    IF RecogFlg%=0 THEN 
  149. 2290     fixQLIB
  150. 2300     IF RecogFlg%=0 THEN 
  151. 2310      RPORT "UNRECOGNISED TASK:..."&CHR$(10)
  152. 2320     END IF 
  153. 2330    END IF 
  154. 2340   END IF 
  155. 2350   IF RecogFlg%=0 THEN 
  156. 2360    Flg%=-1
  157. 2370    IF fl<32768 THEN 
  158. 2380     RPORT "SMALL CODE: try QL-Compatible TAS replacement ":Rplc$=WAITKEY$(3,"ynq")
  159. 2390     IF Rplc$=="q" THEN EXIT main_loop
  160. 2400     IF Rplc$=="y" THEN 
  161. 2410      treatTAS
  162. 2420      IF Flg%=0 THEN 
  163. 2430       fl=LastByte-base
  164. 2440      ELSE 
  165. 2450       RPORT "THERE WERE ERRORS: re-loading CODE"&CHR$(10)
  166. 2460       LBYTES InFile$,base
  167. 2470      END IF 
  168. 2480     END IF 
  169. 2490    END IF 
  170. 2500    IF Flg%<>0 THEN 
  171. 2510     RPORT "Attempting A-Line TAS replacement"&CHR$(10)
  172. 2520     fixTAS
  173. 2530    END IF 
  174. 2540   END IF 
  175. 2550   IF NoRpc% THEN 
  176. 2560    RPORT "Saving..."&CHR$(10)
  177. 2570    IF ft=1 THEN 
  178. 2580     DELETE OutFile$
  179. 2590     SEXEC OutFile$,base,fl,fd
  180. 2600    ELSE 
  181. 2610     DELETE OutFile$
  182. 2620     SBYTES OutFile$,base,fl
  183. 2630    END IF 
  184. 2640   ELSE 
  185. 2650    RPORT "No changes."&CHR$(10)
  186. 2660   END IF 
  187. 2670   RECHP(base)
  188. 2680   IF (InFlg%=0) OR (NoRplc%=0) THEN 
  189. 2690    Rplc$=INKEY$(#3,200)
  190. 2700    IF InFlg%=0 THEN EXIT main_loop
  191. 2710   END IF 
  192. 2720  END REPeat main_loop
  193. 2750 END REPeat outer_loop
  194. 2760 CLOSE#8
  195. 2770 RECHP(Buff)
  196. 2780 CLOSE#3
  197. 2790 CLOSE#4
  198. 2800 CLOSE#5
  199. 2810 IF InFlg%<>0 THEN CLOSE#7:DELETE OutFile$&"NO_TAS_dat":InFlg%=0
  200. 2820 STOP
  201. 2830 :
  202. 2840 DEFine PROCedure fixSYSV
  203. 2850  LOCal a,p,i,N
  204. 2860  CLS#4
  205. 2870  p=0
  206. 2880  REPeat find_loop
  207. 2890   BLOCK#4;(p/fl)*100,10,0,0,4
  208. 2900   pk=PEEK_L(base+p)
  209. 2910   IF (pk>HEX("28000")) AND (pk<=HEX("28200")) THEN 
  210. 2920    DISOUT
  211. 2930   Rplc$=WAITKEY$(3,"ynaq")
  212. 2940   END IF 
  213. 2950   p=p+2
  214. 2960   IF p>fl THEN EXIT find_loop
  215. 2970  END REPeat find_loop
  216. 2980 END DEFine 
  217. 2990 :
  218. 3000 DEFine PROCedure fixTURBO
  219. 3010  LOCal a,p,i,N,pk,dt
  220. 3020  CLS#4
  221. 3030  RecogFlg%=0:p=0
  222. 3040  REPeat find_loop
  223. 3050   IF p>fl THEN EXIT find_loop
  224. 3060   FOR N=1 TO 256
  225. 3070    pk=PEEK_W(base+p)
  226. 3080    IF (pk=19182) OR (pk=-4050) OR (pk=-466) THEN 
  227. 3090     RESTORE 3270
  228. 3100     fixTURBOsub base+p
  229. 3110    END IF 
  230. 3120    IF (pk=19178) OR (pk=-4054) OR (pk=-470) THEN 
  231. 3130     RESTORE 3320
  232. 3140     fixTURBOsub base+p
  233. 3150    END IF 
  234. 3151    IF (pk=19182) THEN 
  235. 3152     RESTORE 3370
  236. 3154     fixTURBOsub base+p
  237. 3157    END IF 
  238. 3160    p=p+2
  239. 3170    IF p>=fl THEN EXIT N
  240. 3180   END FOR N
  241. 3190   IF p>fl THEN 
  242. 3200    BLOCK#4;100,10,0,0,4
  243. 3210   ELSE 
  244. 3220    BLOCK#4;INT((p/fl)*100),10,0,0,4
  245. 3230   END IF 
  246. 3240  END REPeat find_loop
  247. 3250 END DEFine 
  248. 3260 :
  249. 3270 DATA 0,12
  250. 3280 DATA 19182,143,32256,29184,20112,17393,-6144
  251. 3290 DATA 2286,7,143,32256,29184,20112,-11314
  252. 3300 DATA "TURBO"
  253. 3310 :
  254. 3320 DATA -10,8
  255. 3330 DATA 12842,34,8775,19008,26410,19178,23,26404,10249,14849
  256. 3340 DATA 14890,34,8775,19008,26410,2282,7,23,26402,10249
  257. 3350 DATA "TURBO"
  258. 3360 :
  259. 3370 DATA 0,36
  260. 3380 DATA 19182,143,29184,20112,19679,20544,19072,26372,20206,-32048,10847,8799,4117,21632,2176,0,-9280,20206,-32356
  261. 3390 DATA 2286,7,143,29184,20112,19679,20544,19072,26372,20206,-32048,10847,8799,4117,21632,2176,0,-9280,24578
  262. 3400 DATA "superCHARGE"
  263. 3410 :
  264. 3420 DEFine PROCedure fixTURBOsub(a)
  265. 3430 LOCal s,e,i
  266. 3440  READ s,e
  267. 3450  FOR i=s TO e STEP 2
  268. 3460   READ dt
  269. 3470   IF i<>0 THEN 
  270. 3480    IF PEEK_W(a+i)<>dt THEN i=0:EXIT i:END IF 
  271. 3490   END IF 
  272. 3500  END FOR i
  273. 3510  IF i<>0 THEN 
  274. 3520   FOR i=s TO e STEP 2
  275. 3530    READ dt:POKE_W a+i,dt
  276. 3540   END FOR i
  277. 3550   READ a$
  278. 3560   IF RecogFlg%=0 THEN RPORT a$&" TASK:..."&CHR$(10):RecogFlg%=-1
  279. 3570   RPORT "Patched at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  280. 3580  END IF 
  281. 3590 END DEFine 
  282. 3600 :
  283. 3610 DEFine PROCedure fixQLIB
  284. 3620  LOCal l,N,i,X
  285. 3630  RecogFlg%=0
  286. 3640  X=find("Q_Libe"&"rator ",FILL$(CHR$(223),12),base,0,fl)
  287. 3650  IF X<>-1 THEN 
  288. 3660   IF PEEK_W(base+6)<>HEX("4AFB") THEN 
  289. 3670    RPORT "QLIB CODE: "
  290. 3680   ELSE 
  291. 3690    RPORT "QLIB TASK: "
  292. 3700   END IF 
  293. 3710   RPORT "initial scan OK at "&X&"..."&CHR$(10):RecogFlg%=-1
  294. 3720   N=find(CHR$(HEX("4A"))&CHR$(HEX("EE"))&CHR$(HEX("00"))&CHR$(HEX("8f")),CHR$(HEX("FF"))&CHR$(HEX("F8"))&CHR$(HEX("FF"))&CHR$(HEX("FF")),base,0,fl)
  295. 3730   IF N<>-1 THEN 
  296. 3740    REMark Truncate copyright notice
  297. 3750    REMark to make room for m/c sub
  298. 3760    l=PEEK_W(base+X-2)-12:POKE_W base+X-2,l
  299. 3770    FOR i=0 TO l-1
  300. 3780     POKE base+X+i,PEEK(base+X+i+12)
  301. 3790    END FOR i
  302. 3800    REMark Create subroutine:
  303. 3810    REMark BSET #7,$8F(A0)
  304. 3820    REMark RTS
  305. 3830    POKE base+X+l,HEX('08')
  306. 3840    POKE base+X+l+1,HEX('E8')
  307. 3850    POKE base+X+l+2,HEX('00')
  308. 3860    POKE base+X+l+3,HEX('07')
  309. 3870    POKE base+X+l+4,HEX('00')
  310. 3880    POKE base+X+l+5,HEX('8F')
  311. 3890    POKE base+X+l+6,HEX('4E')
  312. 3900    POKE base+X+l+7,HEX('75')
  313. 3910    REMark Customize subroutine
  314. 3920    POKE base+X+l+1,PEEK(base+N+1)
  315. 3930    REMark Overwrite TAS $8F(An)
  316. 3940    REMark with a BSR instruction
  317. 3950    POKE base+N,HEX("61"):POKE base+N+1,HEX("00")
  318. 3960    POKE_W base+N+2,X+l-N-2
  319. 3970    RPORT "Patched at $"&HEX$(N,32)&CHR$(10):NoRpc%=NoRpc%+1
  320. 3980   END IF 
  321. 3990  END IF 
  322. 4000 END DEFine 
  323. 4010 :
  324. 4020 DEFine PROCedure fixTAS
  325. 4030  CLS#4
  326. 4040  EA_mask=HEX('003F')
  327. 4050  TAS_mask=HEX('FFC0')-HEX('10000')
  328. 4060  LINEF_7_inst=HEX('AE00')-HEX('10000')
  329. 4070  TAS_inst=HEX('4AC0')
  330. 4080  p=0
  331. 4090  REPeat Replace_loop
  332. 4100   IF p>=fl THEN EXIT Replace_loop
  333. 4110   FOR N=1 TO 256
  334. 4120    pk=PEEK_W(base+p)
  335. 4130    IF ((pk && TAS_mask)=TAS_inst) THEN 
  336. 4140     ea=pk && EA_mask
  337. 4150     SELect ON ea
  338. 4160     =0 TO 7 : REMark dn - can handle this!
  339. 4170      REMark RPORT HEX$(p,32)&" TAS d"&(ea&&7)
  340. 4180      REMark Replace_TAS
  341. 4190     =16 TO 23 : REMark  (an)
  342. 4200      RPORT HEX$(p,32)&" TAS (a"&(ea&&7)&")"
  343. 4210      Replace_TAS
  344. 4220     =24 TO 31 : REMark  (an)+
  345. 4230      RPORT HEX$(p,32)&" TAS (a"&(ea&&7)&")+"
  346. 4240      Replace_TAS
  347. 4250     =32 TO 39 : REMark  -(an)
  348. 4260      RPORT HEX$(p,32)&" TAS -(a"&(ea&&7)&")"
  349. 4270      Replace_TAS
  350. 4280     =40 TO 47 : REMark d(an)
  351. 4290      RPORT HEX$(p,32)&" TAS "&HEX$(PEEK_W(base+p+2),16)&"(a"&(ea&&7)&")"
  352. 4300      Replace_TAS
  353. 4310     =48 TO 55 : REMark d(an,a/dn)
  354. 4320      RPORT HEX$(p,32)&" TAS $"&HEX$(PEEK(base+p+3),8)&"(a"&(ea&&7)&","&("da"(1+(INT(PEEK(base+p+2)/128)&&1)))&INT(PEEK(base+p+2)/16)&&7&"."&("wl"(1+(INT(PEEK(base+p+2)/8)&&1)))&")"
  355. 4330      Replace_TAS
  356. 4340     =56 : REMark $.w
  357. 4350      RPORT HEX$(p,32)&" TAS $"&HEX$(PEEK_W(base+p+2),16)
  358. 4360      Replace_TAS
  359. 4370     =57 : REMark $.l
  360. 4380      RPORT HEX$(p,32)&" TAS $"&HEX$(PEEK_L(base+p+2),32)
  361. 4390      Replace_TAS
  362. 4400     =REMAINDER : REMark impossible
  363. 4410      REMark ignore illegal address modes
  364. 4420     END SELect 
  365. 4430     IF Rplc$=="Q" THEN NoRpc%=0:EXIT Replace_loop
  366. 4440    ELSE 
  367. 4441     temp$=HEX$(PEEK_L(base+p),32)
  368. 4442     IF temp$=="46FC0000" THEN 
  369. 4443      POKE_L base+p,HEX("027CC0FF"):DISOUT:RPORT "tidying code at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  370. 4446     END IF 
  371. 4448    END IF 
  372. 4450    p=p+2
  373. 4460    IF p>=fl THEN EXIT N
  374. 4470   END FOR N
  375. 4480   IF p>fl THEN 
  376. 4490    BLOCK#4;100,10,0,0,4
  377. 4500   ELSE 
  378. 4510    BLOCK#4;INT((p/fl)*100),10,0,0,4
  379. 4520   END IF 
  380. 4530  END REPeat Replace_loop
  381. 4540 END DEFine 
  382. 4550 :
  383. 4560 DEFine PROCedure Replace_TAS
  384. 4570  LOCal get_loop
  385. 4580  IF NOT(Rplc$=="a")
  386. 4590   DISOUT
  387. 4600   Rplc$=WAITKEY$(3,"ynaq")
  388. 4610   CLS#5
  389. 4620  ELSE 
  390. 4630   RPORT " replaced."&CHR$(10)
  391. 4640  END IF 
  392. 4650  IF Rplc$=="y" OR Rplc$=="a" THEN 
  393. 4660   POKE_W base+p,LINEF_7_inst||ea
  394. 4670   NoRpc%=NoRpc%+1
  395. 4680  END IF 
  396. 4690 END DEFine 
  397. 4700 :
  398. 4710 DEFine PROCedure treatTAS
  399. 4720  REMark Replace TAS instructions in a QL-friendly way.
  400. 4730  REMark Extends the code, so may not be reliable with
  401. 4740  REMark tasks that assume their own size.
  402. 4750  CLS#4
  403. 4760  EA_mask=HEX('003F')
  404. 4770  TST_mask=HEX('4A00'):BSET_mask=HEX('08C0')
  405. 4780  TAS_mask=HEX('FFC0')-HEX('10000')
  406. 4790  TAS_inst=HEX('4AC0')
  407. 4800  BSR_inst=HEX('6100')
  408. 4810  RTS_inst=HEX('4E75')
  409. 4820  NOP_inst=HEX('4E71')
  410. 4830  LastByte=base+fl
  411. 4840  Rplc$=""
  412. 4850  p=0:Flg%=0
  413. 4860  REPeat Replace_loop
  414. 4870   IF p>=fl THEN EXIT Replace_loop
  415. 4880   FOR N=1 TO 256
  416. 4890    pk=PEEK_W(base+p)
  417. 4900    IF ((pk && TAS_mask)=TAS_inst) THEN 
  418. 4910     ea=pk && EA_mask
  419. 4920     SELect ON ea
  420. 4930     =0 TO 7 : REMark dn - can handle this!
  421. 4940      REMark RPORT HEX$(p,32)&" TAS d"&ea&&7
  422. 4950      REMark Treat_ARI
  423. 4960     =16 TO 23 : REMark  (an)
  424. 4970      RPORT HEX$(p,32)&" TAS (a"&(ea&&7)&")"
  425. 4980      Treat_ARI
  426. 4990     =24 TO 31 : REMark  (an)+
  427. 5000      RPORT HEX$(p,32)&" TAS (a"&(ea&&7)&")+"
  428. 5010      Treat_ARI
  429. 5020     =32 TO 39 : REMark  -(an)
  430. 5030      RPORT HEX$(p,32)&" TAS -(a"&(ea&&7)&")"
  431. 5040      Treat_ARI
  432. 5050     =40 TO 47 : REMark d(an)
  433. 5060      RPORT HEX$(p,32)&" TAS "&HEX$(PEEK_W(base+p+2),16)&"(a"&(ea&&7)&")"
  434. 5070      Treat_ARID
  435. 5080     =48 TO 55 : REMark d(an,a/dn)
  436. 5090      RPORT HEX$(p,32)&" TAS $"&HEX$(PEEK(base+p+3),8)&"(a"&(ea&&7)&","&("da"(1+(INT(PEEK(base+p+2)/128)&&1)))&INT(PEEK(base+p+2)/16)&&7&"."&("wl"(1+(INT(PEEK(base+p+2)/8)&&1)))&")"
  437. 5100      Treat_ARID
  438. 5110     =56 : REMark $.w
  439. 5120      RPORT HEX$(p,32)&" TAS $"&HEX$(PEEK_W(base+p+2),16)
  440. 5130      Treat_ARID
  441. 5140     =57 : REMark $.l
  442. 5150      RPORT HEX$(p,32)&" TAS $"&HEX$(PEEK_W(base+p+2),32)
  443. 5160      Treat_ABSL
  444. 5170     =REMAINDER : REMark impossible ea
  445. 5180      REMark ignore illegal address modes
  446. 5190     END SELect 
  447. 5200     IF Rplc$=="Q" OR Flg%=-1 THEN NoRpc%=0:EXIT Replace_loop
  448. 5210    ELSE 
  449. 5211     temp$=HEX$(PEEK_L(base+p),32)
  450. 5212     IF temp$=="46FC0000" THEN 
  451. 5213      POKE_L base+p,HEX("027CC0FF"):DISOUT:RPORT "tidying code at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  452. 5216     END IF 
  453. 5218    END IF 
  454. 5220    p=p+2
  455. 5230    IF p>=fl THEN EXIT N
  456. 5240   END FOR N
  457. 5250   IF p>fl THEN 
  458. 5260    BLOCK#4;100,10,0,0,4
  459. 5270   ELSE 
  460. 5280    BLOCK#4;INT((p/fl)*100),10,0,0,4
  461. 5290   END IF 
  462. 5300  END REPeat Replace_loop
  463. 5310 END DEFine 
  464. 5320 :
  465. 5330 DEFine PROCedure Treat_ARI
  466. 5340  LOCal disp,get_loop
  467. 5350  disp=LastByte-(base+p+2)
  468. 5360  IF NOT(Rplc$=="a")
  469. 5370   DISOUT
  470. 5380   Rplc$=WAITKEY$(3,"ynaq")
  471. 5390   CLS#5
  472. 5400  END IF 
  473. 5410  IF Rplc$=="y" OR Rplc$=="a" THEN 
  474. 5420   IF disp>126 THEN 
  475. 5430    RPORT " ERROR: OFFSET TOO LARGE"&CHR$(10):Flg%=-1
  476. 5440   ELSE 
  477. 5450    POKE_W LastByte,TST_mask&&ea:LastByte=LastByte+2
  478. 5460    POKE_W LastByte,BSET_mask||ea:LastByte=LastByte+2
  479. 5470    POKE_W LastByte,7:LastByte=LastByte+2
  480. 5480    POKE_W LastByte,RTS_inst:LastByte=LastByte+2
  481. 5490    POKE_W base+p,BSR_inst||disp
  482. 5500    NoRpc%=NoRpc%+1
  483. 5510    IF Rplc$=="a" THEN RPORT " replaced."&CHR$(10)
  484. 5520   END IF 
  485. 5530  END IF 
  486. 5540 END DEFine 
  487. 5550 :
  488. 5560 DEFine PROCedure Treat_ARID
  489. 5570  LOCal disp
  490. 5580  disp=LastByte-(base+p+2)
  491. 5590  IF NOT(Rplc$=="a")
  492. 5600   DISOUT
  493. 5610   Rplc$=WAITKEY$(3,"ynaq")
  494. 5620   CLS#5
  495. 5630  END IF 
  496. 5640  IF Rplc$=="y" OR Rplc$=="a" THEN 
  497. 5650   IF disp>32766 THEN 
  498. 5660    RPORT " ERROR: FILE TOO BIG"&CHR$(10):Flg%=-1
  499. 5670   ELSE 
  500. 5680    POKE_W LastByte,TST_mask||ea:LastByte=LastByte+2
  501. 5690    POKE_W LastByte,PEEK_W(base+p+2):LastByte=LastByte+2
  502. 5700    POKE_W LastByte,BSET_mask||ea:LastByte=LastByte+2
  503. 5710    POKE_W LastByte,7:LastByte=LastByte+2
  504. 5720    POKE_W LastByte,PEEK_W(base+p+2):LastByte=LastByte+2
  505. 5730    POKE_W LastByte,RTS_inst:LastByte=LastByte+2
  506. 5740    POKE_W base+p,BSR_inst
  507. 5750    POKE_W base+p+2,disp
  508. 5760    NoRpc%=NoRpc%+1
  509. 5770    IF Rplc$=="a" THEN RPORT " replaced."&CHR$(10)
  510. 5780   END IF 
  511. 5790  END IF 
  512. 5800 END DEFine 
  513. 5810 :
  514. 5820 DEFine PROCedure Treat_ABSL
  515. 5830  LOCal disp
  516. 5840  disp=LastByte-(base+p+2)
  517. 5850  IF NOT(Rplc$=="a")
  518. 5860   DISOUT
  519. 5870   Rplc$=WAITKEY$(3,"ynaq")
  520. 5880   CLS#5
  521. 5890  END IF 
  522. 5900  IF Rplc$=="y" OR Rplc$=="a" THEN 
  523. 5910   IF disp>32766 THEN 
  524. 5920    RPORT " ERROR: FILE TOO BIG"&CHR$(10):Flg%=-1
  525. 5930   ELSE 
  526. 5940    POKE_W LastByte,TST_mask||ea:LastByte=LastByte+2
  527. 5950    POKE_L LastByte,PEEK_L(base+p+2):LastByte=LastByte+4
  528. 5960    POKE_W LastByte,BSET_mask||ea:LastByte=LastByte+2
  529. 5970    POKE_W LastByte,7:LastByte=LastByte+2
  530. 5980    POKE_L LastByte,PEEK_L(base+p+2):LastByte=LastByte+4
  531. 5990    POKE_W LastByte,RTS_inst:LastByte=LastByte+2
  532. 6000    POKE_W base+p,BSR_inst
  533. 6010    POKE_W base+p+2,disp
  534. 6020    POKE_W base+p+4,NOP_inst
  535. 6030    NoRpc%=NoRpc%+1
  536. 6040    IF Rplc$=="a" THEN RPORT " replaced."&CHR$(10)
  537. 6050   END IF 
  538. 6060  END IF 
  539. 6070 END DEFine 
  540. 6080 :
  541. 10000 DEFine PROCedure DISOUT
  542. 10010  LOCal loop, preLoop, disLoop
  543. 10020  LOCal r, Ds, Q, N, c, i
  544. 10030  r=Rows/2
  545. 10040  Ds=0
  546. 10050  FOR i=1 TO r
  547. 10060   D(i)=0
  548. 10070  END FOR i
  549. 10080  Q=p-8*r
  550. 10090  IF Q<0 THEN Q=0
  551. 10100  REPeat preLoop
  552. 10110   N=D68K(base+Q,Q\Buff)
  553. 10120   Q=Q+N
  554. 10130   Ds=Ds-D(i)+N
  555. 10140   D(i)=N
  556. 10150   REPeat loop
  557. 10160    i=1+(i MOD r)
  558. 10170    N=N-6
  559. 10180    IF N<=0 THEN EXIT loop
  560. 10190    Ds=Ds-D(i)
  561. 10200    D(i)=0
  562. 10210   END REPeat loop
  563. 10220   IF Q>=p THEN EXIT preLoop
  564. 10230  END REPeat preLoop
  565. 10240  CLS#5
  566. 10250  Q=Q-Ds
  567. 10260  r=Rows
  568. 10270  dflag=0
  569. 10280  REPeat disLoop
  570. 10290   N=D68K(base+Q,Q\Buff)
  571. 10300   i=0:P$=" "
  572. 10310   REPeat loop
  573. 10320    c=PEEK(Buff+i)
  574. 10330    IF c=0 THEN EXIT loop
  575. 10340    i=i+1
  576. 10350    P$=P$(1 TO LEN(P$))&CHR$(c)
  577. 10360   END REPeat loop
  578. 10370   IF (Q<=p) AND ((Q+N)>p) THEN 
  579. 10380    IF dflag AND NOT("tas" INSTR P$(1 TO LEN(P$)))
  580. 10390     P$=P$(1 TO 14)&"         dc.w      $"&P$(11 TO 14)&CHR$(10):dflag=1:N=2
  581. 10400     INK#5;4
  582. 10410    ELSE 
  583. 10420     INK#5;7
  584. 10430    END IF 
  585. 10440   ELSE 
  586. 10450    INK#5;4
  587. 10460     dflag="dc." INSTR P$(1 TO LEN(P$))
  588. 10470   END IF 
  589. 10480   Q=Q+N
  590. 10490   r=r-((N+5) DIV 6)
  591. 10500   IF r<0 THEN EXIT disLoop
  592. 10510   PRINT#5;P$(1 TO LEN(P$));
  593. 10520  END REPeat disLoop
  594. 10530 END DEFine 
  595. 10540 :
  596. 10550 DEFine FuNction FILE_CLASS$(i$)
  597. 10560  i=0
  598. 10570  REPeat check_loop
  599. 10580   j="_" INSTR i$(i+1 TO LEN(i$))
  600. 10590   IF j=0 THEN EXIT check_loop
  601. 10600   i=i+j
  602. 10610   IF i=LEN(i$) THEN RETurn ""
  603. 10620  END REPeat check_loop
  604. 10630  IF i=0 THEN 
  605. 10640   j=-1
  606. 10650  ELSE 
  607. 10660   IF (i=5) AND (i$(1 TO i) INSTR "ram1_ram2_flp1_flp2_mdv1_mdv2_") THEN 
  608. 10670    j=-1
  609. 10680   END IF 
  610. 10690  END IF 
  611. 10700  IF j<>0 THEN 
  612. 10710   j="_"&i$(i+1 TO LEN(i$))&"_" INSTR "_BOOT_"
  613. 10720   SELect ON j
  614. 10730   =1:a$="SuperBASIC boot program"
  615. 10740   =REMAINDER :a$=""
  616. 10750   END SELect 
  617. 10760   RETurn a$
  618. 10770  ELSE 
  619. 10780   a$=""
  620. 10790   j=(i$(i TO LEN(i$))&"_") INSTR "_c_h_bas_fth_asm_list_txt_text_scr_doc_aba_prg_grf_hob_arc_zip_font_fnt_boot_asc_screen_dbf_scn_log_task_job_bin_code_rext_inc_"
  621. 10800   SELect ON j
  622. 10810   =1:a$="C source"
  623. 10820   =3:a$="C header file"
  624. 10830   =5:a$="SuperBASIC program"
  625. 10840   =9:a$="FORTH program"
  626. 10850   =13:a$="Assembler source"
  627. 10860   =17:a$="Assembler list file"
  628. 10870   =123:a$="Assembler include file"
  629. 10880   =22,26,77,96:a$="ASCII text file"
  630. 10890   =31,81:a$="Screen-save"
  631. 10900   =35:a$="QUILL wordprocess document"
  632. 10910   =39:a$="ABACUS spreadsheet document"
  633. 10920   =43:a$="ARCHIVE program document"
  634. 10930   =88:a$="ARCHIVE database file"
  635. 10940   =92:a$="ARCHIVE screen layout"
  636. 10950   =47:a$="EASEL chart document"
  637. 10960   =51:a$="Psion help file"
  638. 10970   =55:a$="ARC file archive"
  639. 10980   =59:a$="ZIP file archive"
  640. 10990   =63,68:a$="Alternative character set"
  641. 11000   =72:a$="SuperBASIC boot program"
  642. 11010   =100,105:a$="executable TASK"
  643. 11020   =109,113:a$="Machine code"
  644. 11030   =118:a$="Resident extension code"
  645. 11040   =REMAINDER :a$=""
  646. 11050   END SELect 
  647. 11060  END IF 
  648. 11070  RETurn a$
  649. 11080 END DEFine 
  650. 11090 :
  651. 11100 DEFine FuNction WAITKEY$(Chan%,i$)
  652. 11110  LOCal K$(1),i,l,prompt_loop,get_loop
  653. 11120  RPORT " ("
  654. 11130  i=1:l=LEN(i$)
  655. 11140  REPeat prompt_loop
  656. 11150   RPORT i$(i):i=i+1
  657. 11160   IF i>l THEN EXIT prompt_loop
  658. 11170   RPORT "/"
  659. 11180  END REPeat prompt_loop
  660. 11190  RPORT ")? >"
  661. 11200  CURSEN#Chan%
  662. 11210  REPeat get_loop
  663. 11220   K$=INKEY$(#Chan%,-1)
  664. 11230   IF K$ INSTR i$ THEN EXIT get_loop
  665. 11240  END REPeat get_loop
  666. 11250  CURDIS#Chan%
  667. 11260  RPORT K$&CHR$(10)
  668. 11270  RETurn K$
  669. 11280 END DEFine 
  670. 11290 :
  671. 11300 DEFine PROCedure RPORT(temp$)
  672. 11310  PRINT#3;temp$;
  673. 11320 END DEFine 
  674. 11330 :
  675. 11340 DEFine FuNction find(txt$,msk$,base,s,e)
  676. 11350  LOCal i,j,K,l
  677. 11360  CLS#4
  678. 11370  l=-1
  679. 11380  i=s
  680. 11390  REPeat i_loop
  681. 11400   j=0
  682. 11410   REPeat j_loop
  683. 11420    K=0
  684. 11430    REPeat k_loop
  685. 11440     IF (PEEK(base+i+j+K)&&CODE(msk$(K+1)))<>(CODE(txt$(K+1))&&CODE(msk$(K+1))) THEN EXIT k_loop
  686. 11450     K=K+1
  687. 11460     IF K=LEN(txt$) THEN 
  688. 11470      l=i+j:EXIT i_loop
  689. 11480     END IF 
  690. 11490    END REPeat k_loop
  691. 11500    j=j+1
  692. 11510    IF j=256 THEN EXIT j_loop
  693. 11520   END REPeat j_loop
  694. 11530   IF i>=e THEN 
  695. 11540    BLOCK #4,100,10,0,0,4
  696. 11550   ELSE 
  697. 11560    BLOCK#4;((i-s)/(e-s))*100,10,0,0,4
  698. 11570   END IF 
  699. 11580   i=i+256
  700. 11590   IF (i-e)>=256 THEN EXIT i_loop
  701. 11600  END REPeat i_loop
  702. 11610  RETurn l
  703. 11620 END DEFine 
  704. 11630 :
  705.